local-serverless-stack 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/CHANGELOG.md +125 -3
  2. package/README.md +92 -38
  3. package/bin/cli.js +218 -28
  4. package/bin/i18n.js +57 -3
  5. package/dist/client/index.d.ts +1 -1
  6. package/dist/client/index.d.ts.map +1 -1
  7. package/dist/client/namespaces/services.d.ts +46 -0
  8. package/dist/client/namespaces/services.d.ts.map +1 -1
  9. package/dist/client/namespaces/services.js +1 -0
  10. package/dist/client/namespaces/services.js.map +1 -1
  11. package/dist/mcp/tools.d.ts.map +1 -1
  12. package/dist/mcp/tools.js +17 -0
  13. package/dist/mcp/tools.js.map +1 -1
  14. package/dist/server/engine/backends/self-backend.d.ts +26 -1
  15. package/dist/server/engine/backends/self-backend.d.ts.map +1 -1
  16. package/dist/server/engine/backends/self-backend.js +104 -11
  17. package/dist/server/engine/backends/self-backend.js.map +1 -1
  18. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -1
  19. package/dist/server/engine/emulators/dynamodb/expressions/parser.js +12 -1
  20. package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -1
  21. package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.d.ts +3 -0
  22. package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.d.ts.map +1 -0
  23. package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.js +78 -0
  24. package/dist/server/engine/emulators/dynamodb/expressions/reserved-words.js.map +1 -0
  25. package/dist/server/engine/emulators/dynamodb/index.d.ts +11 -0
  26. package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -1
  27. package/dist/server/engine/emulators/dynamodb/index.js +101 -7
  28. package/dist/server/engine/emulators/dynamodb/index.js.map +1 -1
  29. package/dist/server/engine/emulators/dynamodb/query.d.ts +1 -0
  30. package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -1
  31. package/dist/server/engine/emulators/dynamodb/query.js +34 -6
  32. package/dist/server/engine/emulators/dynamodb/query.js.map +1 -1
  33. package/dist/server/engine/emulators/s3/index.d.ts +10 -0
  34. package/dist/server/engine/emulators/s3/index.d.ts.map +1 -1
  35. package/dist/server/engine/emulators/s3/index.js +369 -25
  36. package/dist/server/engine/emulators/s3/index.js.map +1 -1
  37. package/dist/server/engine/emulators/sqs/index.d.ts +2 -0
  38. package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -1
  39. package/dist/server/engine/emulators/sqs/index.js +70 -7
  40. package/dist/server/engine/emulators/sqs/index.js.map +1 -1
  41. package/dist/server/engine/emulators/sqs/queue.d.ts +2 -1
  42. package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -1
  43. package/dist/server/engine/emulators/sqs/queue.js +68 -35
  44. package/dist/server/engine/emulators/sqs/queue.js.map +1 -1
  45. package/dist/server/engine/emulators/ssm/index.d.ts +31 -0
  46. package/dist/server/engine/emulators/ssm/index.d.ts.map +1 -0
  47. package/dist/server/engine/emulators/ssm/index.js +670 -0
  48. package/dist/server/engine/emulators/ssm/index.js.map +1 -0
  49. package/dist/server/engine/http/errors.d.ts +1 -0
  50. package/dist/server/engine/http/errors.d.ts.map +1 -1
  51. package/dist/server/engine/http/errors.js +13 -5
  52. package/dist/server/engine/http/errors.js.map +1 -1
  53. package/dist/server/engine/http/is-aws-request.d.ts.map +1 -1
  54. package/dist/server/engine/http/is-aws-request.js +13 -3
  55. package/dist/server/engine/http/is-aws-request.js.map +1 -1
  56. package/dist/server/engine/http/protocols/aws-json.d.ts +1 -0
  57. package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -1
  58. package/dist/server/engine/http/protocols/aws-json.js +13 -0
  59. package/dist/server/engine/http/protocols/aws-json.js.map +1 -1
  60. package/dist/server/engine/http/reset.d.ts +4 -0
  61. package/dist/server/engine/http/reset.d.ts.map +1 -0
  62. package/dist/server/engine/http/reset.js +17 -0
  63. package/dist/server/engine/http/reset.js.map +1 -0
  64. package/dist/server/engine/http/router.d.ts +1 -0
  65. package/dist/server/engine/http/router.d.ts.map +1 -1
  66. package/dist/server/engine/http/router.js +185 -34
  67. package/dist/server/engine/http/router.js.map +1 -1
  68. package/dist/server/engine/types.d.ts +2 -1
  69. package/dist/server/engine/types.d.ts.map +1 -1
  70. package/dist/server/routes/apis.d.ts.map +1 -1
  71. package/dist/server/routes/apis.js +6 -0
  72. package/dist/server/routes/apis.js.map +1 -1
  73. package/dist/server/routes/config.d.ts.map +1 -1
  74. package/dist/server/routes/config.js +25 -1
  75. package/dist/server/routes/config.js.map +1 -1
  76. package/dist/server/routes/lambdas.d.ts.map +1 -1
  77. package/dist/server/routes/lambdas.js +12 -0
  78. package/dist/server/routes/lambdas.js.map +1 -1
  79. package/dist/server/routes/services.d.ts.map +1 -1
  80. package/dist/server/routes/services.js +66 -5
  81. package/dist/server/routes/services.js.map +1 -1
  82. package/dist/server/runtime/runtime-worker.js +40 -3
  83. package/dist/server/runtime/runtime-worker.js.map +1 -1
  84. package/dist/server/services/api-gateway-events.d.ts +14 -0
  85. package/dist/server/services/api-gateway-events.d.ts.map +1 -1
  86. package/dist/server/services/api-gateway-events.js +114 -8
  87. package/dist/server/services/api-gateway-events.js.map +1 -1
  88. package/dist/server/services/artifact-staleness.d.ts +20 -0
  89. package/dist/server/services/artifact-staleness.d.ts.map +1 -0
  90. package/dist/server/services/artifact-staleness.js +115 -0
  91. package/dist/server/services/artifact-staleness.js.map +1 -0
  92. package/dist/server/services/authorizer-service.d.ts +34 -5
  93. package/dist/server/services/authorizer-service.d.ts.map +1 -1
  94. package/dist/server/services/authorizer-service.js +0 -0
  95. package/dist/server/services/authorizer-service.js.map +1 -1
  96. package/dist/server/services/cache-manager.d.ts +5 -0
  97. package/dist/server/services/cache-manager.d.ts.map +1 -1
  98. package/dist/server/services/cache-manager.js.map +1 -1
  99. package/dist/server/services/cfn-intrinsics.d.ts +63 -0
  100. package/dist/server/services/cfn-intrinsics.d.ts.map +1 -0
  101. package/dist/server/services/cfn-intrinsics.js +403 -0
  102. package/dist/server/services/cfn-intrinsics.js.map +1 -0
  103. package/dist/server/services/cfn-physical-values.d.ts +51 -0
  104. package/dist/server/services/cfn-physical-values.d.ts.map +1 -0
  105. package/dist/server/services/cfn-physical-values.js +186 -0
  106. package/dist/server/services/cfn-physical-values.js.map +1 -0
  107. package/dist/server/services/cloudformation-parser.d.ts +26 -3
  108. package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
  109. package/dist/server/services/cloudformation-parser.js +79 -7
  110. package/dist/server/services/cloudformation-parser.js.map +1 -1
  111. package/dist/server/services/config-manager.d.ts +49 -2
  112. package/dist/server/services/config-manager.d.ts.map +1 -1
  113. package/dist/server/services/config-manager.js +206 -24
  114. package/dist/server/services/config-manager.js.map +1 -1
  115. package/dist/server/services/gateway-manager.d.ts.map +1 -1
  116. package/dist/server/services/gateway-manager.js +52 -20
  117. package/dist/server/services/gateway-manager.js.map +1 -1
  118. package/dist/server/services/lambda-runtime-manager.d.ts +2 -0
  119. package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -1
  120. package/dist/server/services/lambda-runtime-manager.js +49 -15
  121. package/dist/server/services/lambda-runtime-manager.js.map +1 -1
  122. package/dist/server/services/raw-api-assembler.d.ts +1 -1
  123. package/dist/server/services/raw-api-assembler.d.ts.map +1 -1
  124. package/dist/server/services/raw-api-assembler.js +18 -8
  125. package/dist/server/services/raw-api-assembler.js.map +1 -1
  126. package/dist/server/services/resource-provisioner.d.ts +31 -1
  127. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  128. package/dist/server/services/resource-provisioner.js +257 -25
  129. package/dist/server/services/resource-provisioner.js.map +1 -1
  130. package/dist/server/services/s3-explorer.js +1 -1
  131. package/dist/server/services/seed-manager.d.ts.map +1 -1
  132. package/dist/server/services/seed-manager.js +11 -6
  133. package/dist/server/services/seed-manager.js.map +1 -1
  134. package/dist/server/services/serverless-state-parser.d.ts +45 -2
  135. package/dist/server/services/serverless-state-parser.d.ts.map +1 -1
  136. package/dist/server/services/serverless-state-parser.js +217 -29
  137. package/dist/server/services/serverless-state-parser.js.map +1 -1
  138. package/dist/server/services/service-graph.d.ts +76 -0
  139. package/dist/server/services/service-graph.d.ts.map +1 -0
  140. package/dist/server/services/service-graph.js +914 -0
  141. package/dist/server/services/service-graph.js.map +1 -0
  142. package/dist/server/services/service-registrar.d.ts +17 -1
  143. package/dist/server/services/service-registrar.d.ts.map +1 -1
  144. package/dist/server/services/service-registrar.js +190 -66
  145. package/dist/server/services/service-registrar.js.map +1 -1
  146. package/dist/server/services/service-scanner.d.ts +7 -2
  147. package/dist/server/services/service-scanner.d.ts.map +1 -1
  148. package/dist/server/services/service-scanner.js +53 -7
  149. package/dist/server/services/service-scanner.js.map +1 -1
  150. package/dist/server/services/source-watcher.d.ts +1 -0
  151. package/dist/server/services/source-watcher.d.ts.map +1 -1
  152. package/dist/server/services/source-watcher.js +19 -1
  153. package/dist/server/services/source-watcher.js.map +1 -1
  154. package/dist/server/services/worker-runtime.d.ts +82 -0
  155. package/dist/server/services/worker-runtime.d.ts.map +1 -0
  156. package/dist/server/services/worker-runtime.js +303 -0
  157. package/dist/server/services/worker-runtime.js.map +1 -0
  158. package/dist/ui/assets/ApisPage-BkW-QZ0X.js +1 -0
  159. package/dist/ui/assets/BucketDetailPage-CJwTQJh7.js +1 -0
  160. package/dist/ui/assets/BucketsPage-B1xPVhZC.js +1 -0
  161. package/dist/ui/assets/DynamoPage-DvbpwZDc.js +1 -0
  162. package/dist/ui/assets/DynamoTablePage-xn3Lq3so.js +3 -0
  163. package/dist/ui/assets/LambdaDetailPage-BhUyO77H.js +4 -0
  164. package/dist/ui/assets/LambdasPage-CUF_4rOH.js +1 -0
  165. package/dist/ui/assets/OnboardingPage-U49THUzu.js +1 -0
  166. package/dist/ui/assets/OpenSearchCollectionPage-BJTVNCq4.js +1 -0
  167. package/dist/ui/assets/OpenSearchPage-4s-egkB9.js +1 -0
  168. package/dist/ui/assets/OverviewPage-DJeJQktG.js +1 -0
  169. package/dist/ui/assets/{OverviewPage-C1pBJ8aP.css → OverviewPage-DjQETmb_.css} +1 -1
  170. package/dist/ui/assets/QueueDetailPage-DWsy5Yt8.js +1 -0
  171. package/dist/ui/assets/QueuesPage-BZJSqman.js +1 -0
  172. package/dist/ui/assets/SecretsPage-YC9ua54G.js +1 -0
  173. package/dist/ui/assets/ServiceDetailPage-Cum5frP4.js +2 -0
  174. package/dist/ui/assets/ServicesPage-IpaPDuqx.js +2 -0
  175. package/dist/ui/assets/SettingsPage-BiCRU8O6.js +1 -0
  176. package/dist/ui/assets/index-BDlrAJhi.css +1 -0
  177. package/dist/ui/assets/index-BouKSS43.js +38 -0
  178. package/dist/ui/assets/resourceIcons-DZs28nbs.js +1 -0
  179. package/dist/ui/index.html +5 -2
  180. package/package.json +1 -1
  181. package/dist/ui/assets/ApisPage-BOuimwWz.js +0 -1
  182. package/dist/ui/assets/BucketDetailPage-vLYwhoQt.js +0 -1
  183. package/dist/ui/assets/BucketsPage-Cu5lU1Hp.js +0 -1
  184. package/dist/ui/assets/DynamoPage-y3TTEPUL.js +0 -1
  185. package/dist/ui/assets/DynamoTablePage-BnmSRZjc.js +0 -3
  186. package/dist/ui/assets/LambdaDetailPage-B5q_d27t.js +0 -4
  187. package/dist/ui/assets/LambdasPage-CJpRoEDx.js +0 -1
  188. package/dist/ui/assets/OnboardingPage-D02dymQi.js +0 -1
  189. package/dist/ui/assets/OpenSearchCollectionPage-B_wWTlfL.js +0 -1
  190. package/dist/ui/assets/OpenSearchPage-BLEgfF_g.js +0 -1
  191. package/dist/ui/assets/OverviewPage-EdJWiAt6.js +0 -1
  192. package/dist/ui/assets/QueueDetailPage-ByEYHvHe.js +0 -1
  193. package/dist/ui/assets/QueuesPage-CvwYHSll.js +0 -1
  194. package/dist/ui/assets/SecretsPage-DASw8Ntf.js +0 -1
  195. package/dist/ui/assets/ServiceDetailPage-BMsUDg6L.js +0 -2
  196. package/dist/ui/assets/ServicesPage-2JuiIiRr.js +0 -2
  197. package/dist/ui/assets/SettingsPage-DStO4bgN.js +0 -1
  198. package/dist/ui/assets/index-BIEznsi4.js +0 -37
  199. package/dist/ui/assets/index-BRMvNP3Y.css +0 -1
  200. package/dist/ui/assets/resourceIcons-baecADXA.js +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,126 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [1.1.0] - 2026-10-18
11
+
12
+ **Templates that run on AWS now run on LSS without an adapter.** A real serverless stack names its
13
+ resources with `!Sub '${AWS::StackName}-orders'`, hands them to functions as `!Ref OrdersTable`,
14
+ points its authorizer at `!GetAtt AuthorizerLambdaFunction.Arn` and leans on S3, SQS and API
15
+ Gateway behaving exactly as AWS does. Each of those used to need a workaround outside LSS; this
16
+ release closes them in the engine, the template pipeline, the Lambda runtime and the gateway.
17
+
18
+ ### Added
19
+
20
+ - **SSM Parameter Store** in the self engine (AWS JSON 1.1, `AmazonSSM.*`): `PutParameter`
21
+ (`String`/`StringList`/`SecureString`, `Overwrite` versioning, `AllowedPattern`, tiers, `DataType`,
22
+ AWS name and hierarchy rules), `GetParameter(s)` with `name:version` / `name:label` selectors,
23
+ `GetParametersByPath` (`Recursive`, filters, paging), `DescribeParameters`, `GetParameterHistory`,
24
+ `LabelParameterVersion`, `DeleteParameter(s)` and tagging. `AWS::SSM::Parameter` is provisioned at
25
+ registration. `SecureString` is not encrypted: without `WithDecryption` an opaque deterministic
26
+ token stands in for the ciphertext.
27
+ - **CloudFormation intrinsics.** A static pass resolves `Parameters` (defaults), pseudo parameters,
28
+ `Mappings`, `Conditions` and `Fn::Sub` / `Join` / `Select` / `Split` / `If` / `FindInMap` /
29
+ `GetAZs` / `Base64` / `ImportValue` before any resource is read; a resource whose `Condition` is
30
+ false is not created. After provisioning, `Ref`/`GetAtt` in function environments become physical
31
+ values — table name, queue URL, stream ARN, secret ARN with its suffix, collection endpoint.
32
+ Authorizers given as `!GetAtt X.Arn`, `Ref`, `!Sub '${X.Arn}'` or `$ref` resolve to the local
33
+ function.
34
+ - **Registration diagnostics**: one summary warning listing the resource types LSS does not
35
+ provision (with counts), a warning for an authorizer whose target cannot be found, and one for a
36
+ packaged stage that differs from the packaging command's `--stage` or the previous registration.
37
+ - **`lss reset`** / `POST /_lss/reset` — empties every emulator in place without restarting or
38
+ rebinding the port, persistent and in-memory alike. Loopback-only and gated on the
39
+ `x-lss-confirm-reset: true` header (a CORS preflight the route never answers, so a web page cannot
40
+ trigger it).
41
+ - **S3 bucket configuration**: Put/Get/DeleteBucketEncryption (none → SSE-S3 `AES256`, as AWS since
42
+ 2023), tagging, Public Access Block and policy (stored, not enforced). Objects keep
43
+ `Content-Disposition`, `Cache-Control`, `Content-Encoding`, `Content-Language`, `Expires` and their
44
+ SSE headers across PutObject, presigned POST and CopyObject.
45
+ - **SQS**: `ListDeadLetterSourceQueues`, `ListQueues` `MaxResults`/`NextToken` paging, and
46
+ `MaximumMessageSize` enforced on body plus attributes.
47
+ - **DynamoDB TTL sweep**: expired items are deleted by a 30 s background pass (not only on read),
48
+ emitting the stream `REMOVE` with the TTL service identity, so TTL-triggered Lambdas fire on
49
+ their own.
50
+ - **Per-service / per-function runtime overrides**: `serviceRuntime.<svc>.env`, `.execArgv` and
51
+ `.functions.<fn>.env`. `env` is re-read per invocation, so an edit applies without a restart.
52
+ - **`selfEngine.fallbackEndpoints`** (per service, by SigV4 signing name) and the
53
+ `LSS_FALLBACK_ENDPOINT` env var for the catch-all.
54
+ - **API Gateway authorizer cache stats** on `GET /api/apis/authorizer-cache`; dashboard `?region=`
55
+ deep links.
56
+
57
+ ### Changed
58
+
59
+ - **Lambda authorizer policies are evaluated** against the request's `methodArn` (`*`/`?`
60
+ wildcards, explicit `Deny` wins). Any `Allow` used to authorize every route. The *policy* is
61
+ cached — one cache per authorizer per API — and re-evaluated per request.
62
+ - **Authorizer errors map like AWS**: a REST authorizer throwing exactly `Unauthorized` is 401;
63
+ any other failure, or a response without `policyDocument.Statement`, is 500. HTTP API authorizer
64
+ failures are 500.
65
+ - **A missing REST route is 403 `Missing Authentication Token`** (HTTP API keeps 404), and `OPTIONS`
66
+ is answered automatically only when CORS is configured.
67
+ - **SQS dead-lettering happens on the receive** that would push `ApproximateReceiveCount` past
68
+ `maxReceiveCount`, not the instant the visibility lapses — the message is still in its source
69
+ queue (and still deletable) in between, as on AWS.
70
+ - **DynamoDB rejects bare reserved words** in expressions (`… reserved keyword: status`), rejects
71
+ `ConsistentRead` on a GSI, caps Query/Scan pages at 1 MB, and evaluates `a <> :v` as true when
72
+ `a` is absent.
73
+ - **`selfEngine.port` defaults to `serverPort`**: setting only `serverPort` / `LSS_DASHBOARD_PORT`
74
+ moves the whole stack instead of also opening 14566.
75
+ - **An explicit `--config` / `LSS_CONFIG` that is missing or unparseable is a hard error** for every
76
+ command, instead of falling back to the default search (which let `lss stop --config ./wrong.json`
77
+ stop another instance).
78
+ - **Lambda workers point at the engine**: `AWS_ENDPOINT_URL`, `test` credentials and the service
79
+ region are set; inherited session tokens, profiles and role credentials are removed. Docs now say
80
+ `AWS_ENDPOINT_URL`, the variable the SDKs actually read.
81
+ - **Unsupported-service errors come back in the caller's protocol** (AWS JSON, Query XML, S3 XML or
82
+ rest-json), name `service.Operation` and link to the coverage table on GitHub.
83
+ - `GET /api/config` exposes runtime `env` maps as key names only (`envKeys`).
84
+ - Dependencies refreshed: `source-map-js`, `handlebars`, `proxy-addr`, `shell-quote` /
85
+ `concurrently`, `brace-expansion`, `adm-zip`, `js-yaml`, `@humanfs/node`,
86
+ `postcss-selector-parser`, and `undici` / `fast-uri` / `js-yaml` in the examples and fixtures.
87
+ - **The repository is English-only.** English was already the language of the source, but not of
88
+ everything around it. Translated: the two PRDs (`docs/PRD_SELF_ENGINE.md`,
89
+ `docs/PRD_API_LAMBDA_EMULATION.md`), the dashboard's UI/UX contract (`src/ui/ui-ux.md`), the
90
+ archived design proposal, the 2026-07-29 handoff — renamed `REVISAO-2026-07-29.md` →
91
+ `REVIEW-2026-07-29.md` — plus the `.vscode/tasks.json` labels/details, the last Portuguese line of
92
+ `TODO.md` and two CHANGELOG entries that quoted CLI output verbatim. What stays non-English is
93
+ what has to: the `pt-BR`/`es` translation catalogues, the language endonyms
94
+ (`Português (BR)`, `Español`), the `sa-east-1 — São Paulo` region label, the `confirmar` token
95
+ `seed:clear` asks the operator to type, and the tests that assert on translated CLI output.
96
+
97
+ ### Fixed
98
+
99
+ - **S3 subresources no longer fall through**: `PUT /bucket?encryption` was a 409
100
+ `BucketAlreadyOwnedByYou`, `DELETE /bucket?tagging` deleted the bucket and `PUT /key?tagging`
101
+ overwrote the object. Unsupported subresources now answer `NotImplemented` (501).
102
+ - **SQS receipt handles**: deleting with the latest handle after the visibility lapsed answered
103
+ 200 and left the message to redeliver; `VisibilityTimeout: 0` left the message invisible until
104
+ the queue timer fired, so an immediate peek missed it roughly half the time.
105
+ - **Artifact mode loads ESM bundles with external packages** — ESM ignores `NODE_PATH`, so LSS now
106
+ links `node_modules` next to the extraction.
107
+ - **Event wiring without an invoke port**: SQS/stream mappings, EventBridge targets and S3
108
+ notifications failed to wire when a service declared no `invokePort`; they are delivered
109
+ in-process.
110
+ - **Function env no longer leaks** between functions sharing a worker.
111
+ - **Hot reload ignores LSS's own state**: a `stateDir` / `dataDir` inside a service caused an
112
+ endless restart loop.
113
+ - **The API Gateway path is decoded once** (`%2525` reached handlers as `%`).
114
+ - **The fallback proxy normalizes a duplicated `Date` header**, which broke the SDK's clock-skew
115
+ correction from the second call on.
116
+ - **Unsigned `GET /?Action=…`** reached the dashboard instead of the engine.
117
+
118
+ - **The dashboard's detected language now reaches `<html lang>` at boot.** The locale resolution
119
+ (stored choice → `navigator.languages` → English) already ran on load, but only an explicit switch
120
+ in the ⋮ menu wrote the result to the document. A browser set to pt-BR therefore got a fully
121
+ translated dashboard that still declared `lang="en"` — the tag `index.html` can only ship
122
+ statically — so screen readers announced Portuguese with English pronunciation and the browser's
123
+ own translate prompt offered to translate a page already in the reader's language. Resolution and
124
+ the manual switch now share one `applyDocumentLang()`, and `tests/unit/ui/i18n-messages.test.ts`
125
+ pins the whole chain (browser languages, stored override, storage disabled, boot, switch) against
126
+ a stubbed browser.
127
+
8
128
  ## [1.0.0] - 2026-07-31
9
129
 
10
130
  **LSS runs on one engine.** The LocalStack backend is gone — not deprecated, removed. The self
@@ -503,7 +623,7 @@ Corrections from integrating LSS 0.5.0 in a real monorepo using osls 4, serverle
503
623
  - **Native TypeScript source loading when available**: in `source` mode, the runtime worker now tries Node's native TypeScript type stripping (`process.features.typescript`) before requiring `esbuild-register`, `tsx`, or `ts-node`.
504
624
 
505
625
  ### Fixed
506
- - **Artifact resolution for osls/serverless package output**: `package.artifact` values such as `s7-identity.zip` are now resolved relative to `.serverless/` as well as the service root, and nonexistent declared candidates no longer suppress the `.serverless/*.zip` scan fallback.
626
+ - **Artifact resolution for osls/serverless package output**: `package.artifact` values such as `acme-identity.zip` are now resolved relative to `.serverless/` as well as the service root, and nonexistent declared candidates no longer suppress the `.serverless/*.zip` scan fallback.
507
627
  - **Stale LocalStack proxy `INVOKE_URL`**: re-registering a service now updates an existing proxy Lambda when the expected invoke URL changed (port renumbering or `invokeHost` changes).
508
628
  - **Service identity collisions**: service registration now uses the `service:` name from `serverless-state.json` instead of the directory basename, with migration for same-root legacy cache entries.
509
629
  - **Event source mapping fidelity**: CloudFormation `StartingPosition`, `MaximumRetryAttempts`, `FunctionResponseTypes`, `MaximumBatchingWindowInSeconds`, `FilterCriteria`, and `DestinationConfig.OnFailure` are parsed/applied where supported; duplicate checks compare the resolved live ARN instead of unresolved CFN refs.
@@ -581,13 +701,13 @@ Testability features for downstream e2e suites: an isolated test instance and a
581
701
  ## [0.1.2] - 2026-05-26
582
702
 
583
703
  ### Added
584
- - **`npx lss seed:clear` now requires interactive confirmation**: before issuing any `DeleteRequest`, the CLI lists the exact LocalStack tables it would wipe, prints the LocalStack URL, makes the "this never touches AWS" guarantee explicit, and waits for the user to type `confirmar` (case-sensitive, exact match after trim). Anything else cancels with `🚫 Cancelado — nenhuma alteração feita.` and no clear call is made. `--yes` / `-y` skips the prompt for CI use.
704
+ - **`npx lss seed:clear` now requires interactive confirmation**: before issuing any `DeleteRequest`, the CLI lists the exact LocalStack tables it would wipe, prints the LocalStack URL, makes the "this never touches AWS" guarantee explicit, and waits for the user to type `confirmar` (case-sensitive, exact match after trim). Anything else cancels with `🚫 Cancelled — nothing was changed.` and no clear call is made. `--yes` / `-y` skips the prompt for CI use.
585
705
  - **Defensive endpoint guard in `SeedManager`**: `clearTable` and `clearAllSeeded` now refuse to run unless the resolved DynamoDB endpoint hostname is on a hardcoded local allowlist (`localhost`, `127.0.0.1`, `::1`, `0.0.0.0`, `host.docker.internal`, `localstack`, `lss-localstack`, `lss-localstack-<port>`, `*.localhost`). If a future refactor ever pointed `LocalStackManager.getConfig()` at a real AWS endpoint, the guard would throw `Refusing destructive operation: endpoint "..." is not a recognized local LocalStack host. seed:clear may ONLY run against LocalStack — never against AWS.` before any AWS SDK call. Architecture already pinned writes to LocalStack via fake credentials; this is belt-and-braces.
586
706
  - **Seed/clear mismatch diagnostic**: `GET /api/seeds` now also returns `liveTables: string[]` (every DynamoDB table currently in LocalStack). When `npx lss seed` skips tables or `npx lss seed:clear` finds no live targets, the CLI prints a two-column diagnostic — seed files inspected on one side, live LocalStack tables on the other — with the hint "Os nomes dos arquivos de seed precisam bater EXATAMENTE com o `TableName` no CloudFormation." This makes seed-name/table-name typos obvious instead of "nothing happened, why?". When the live-tables list is empty, the CLI falls back to the older "run `npx lss start` + `npx serverless deploy` first" hint.
587
707
  - **Test infrastructure**: new `tests/unit/seed-manager-guard.test.ts` (27 tests covering the endpoint allowlist matrix, IPv6 bracket handling, malformed URLs, and that `clearTable`/`clearAllSeeded` invoke the guard) and `tests/unit/cli-seed.test.ts` (21 tests spawning `bin/cli.js` against an in-process HTTP stub of the orchestrator — covers confirmation flow, `--yes`/`-y` bypass, "no live tables" diagnostic, name-mismatch diagnostic, and `formatError` robustness against 500-with-empty-body / 500-with-non-JSON / `{error: ""}` responses).
588
708
 
589
709
  ### Changed
590
- - **`bin/cli.js` error handling never leaves the user with an empty message**: new `formatError(e)` and `buildHttpError(res, data)` helpers walk a fallback chain (`e.message` → `e.code` → `e.name` → body snippet → HTTP status text → "erro desconhecido (sem detalhes)") so a response 500 with no body, a socket reset during orchestrator startup, or an `Error` with empty `.message` all produce a useful CLI line instead of `❌ Não consegui listar as tabelas antes de limpar:` with a blank suffix. Applied to every `console.error` path in `seed`, `seed:clear`, and the underlying `getJson`/`postJson` helpers.
710
+ - **`bin/cli.js` error handling never leaves the user with an empty message**: new `formatError(e)` and `buildHttpError(res, data)` helpers walk a fallback chain (`e.message` → `e.code` → `e.name` → body snippet → HTTP status text → "unknown error (no details)") so a response 500 with no body, a socket reset during orchestrator startup, or an `Error` with empty `.message` all produce a useful CLI line instead of `❌ Could not list the tables before clearing:` with a blank suffix. Applied to every `console.error` path in `seed`, `seed:clear`, and the underlying `getJson`/`postJson` helpers.
591
711
  - **`npx lss seed` hint when tables are missing in LocalStack**: previously printed a generic "tabelas foram puladas" footer. Now it fetches `liveTables` and shows the same mismatch diagnostic as `seed:clear`, so the user sees whether the cause is "I haven't deployed yet" (no live tables) or "my seed file name is wrong" (live tables exist but don't match).
592
712
  - **`firstPositional()` arg parser in the CLI**: commands that accept an optional table name (`seed`, `seed:clear`) now skip args starting with `-`. Without this, `npx lss seed:clear --yes` was interpreting `--yes` as the table name.
593
713
  - **`SeedManager.assertLocalEndpoint` normalizes IPv6 brackets** so URLs like `http://[::1]:4566` (which `new URL().hostname` reports as `[::1]`) match the `::1` entry in the allowlist instead of being rejected as non-local.
@@ -958,6 +1078,8 @@ Not applicable (initial release)
958
1078
 
959
1079
  ## [Unreleased]
960
1080
 
1081
+ ## [1.1.0] - 2026-10-18
1082
+
961
1083
  ### Planned Features
962
1084
  - S3 bucket provisioning
963
1085
  - EventBridge integration